// 生产环境基础URL（根据实际情况修改）
const productionBaseUrl = "https://console-ams-api-qa.ntplat.com";

// 转义正则特殊字符
function escapeRegExp(str) {
  return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
}

// 更新代理规则
function updateRules(targetBaseUrl) {
  return new Promise((resolve) => {
    // 获取现有规则
    chrome.declarativeNetRequest.getDynamicRules((existingRules) => {
      const ruleIds = existingRules.map(rule => rule.id);

      // 合法的资源类型（严格遵循Chrome API要求）
      const validResourceTypes = [
        "main_frame",    // 主页面
        "sub_frame",     // 子框架
        "xmlhttprequest", // AJAX请求（包括fetch的底层实现）
        "script",        // 脚本文件
        "stylesheet",    // 样式表
        "image",         // 图片资源
        "font",          // 字体文件
        "media",         // 媒体文件
        "websocket"      // WebSocket连接
      ];

      // 构建新规则
      const newRules = [{
        id: 1,
        priority: 1000,
        action: {
          type: "redirect",
          redirect: {
            regexSubstitution: `${targetBaseUrl}\\1`
          }
        },
        condition: {
          regexFilter: `^${escapeRegExp(productionBaseUrl)}(/.*)?$`,
          resourceTypes: validResourceTypes,
          requestMethods: ["get", "post", "put", "delete", "options"]
        }
      }];

      // 更新规则
      chrome.declarativeNetRequest.updateDynamicRules({
        removeRuleIds: ruleIds,
        addRules: newRules
      }, () => {
        if (chrome.runtime.lastError) {
          console.error("规则更新失败:", chrome.runtime.lastError);
          resolve(false);
        } else {
          console.log("规则更新成功:", newRules);
          resolve(true);
        }
      });
    });
  });
}

// 注入环境变量修改脚本
function injectEnvScript(tabId, currentEnv) {
  return new Promise((resolve) => {
    // 获取当前页面的URL
    // chrome.scripting.executeScript 函数 运行脚本
    chrome.scripting.executeScript({
      target: { tabId: tabId, allFrames: true },
      world: "MAIN",
      injectImmediately: true,//开始就弄
      func: (currentEnv) => {
        console.log('当前环境：', currentEnv, window.process,);
        let url = currentEnv.baseUrl
        // 0. 针对th项目的特殊处理
        // if (CONFIG) {
        //   CONFIG = currentEnv
        // }
        // 1. 修改全局baseUrl变量
        if (window.baseUrl) window.baseUrl = url;

        // 2. 修改框架环境变量
        if (window.process && window.process.env) {
          window.process.env.VUE_APP_BASE_URL = url;
          window.process.env.REACT_APP_BASE_URL = url;
          window.process.env.NODE_ENV = "development";
        }

        // 3. 修改axios配置
        if (window.axios) {
          // 检查实例配置（假设项目中实例名为 service）
          window.axios.defaults.baseURL = url;
          // 处理已创建的axios实例
          if (window.axiosInstances) {
            window.axiosInstances.forEach(instance => {
              instance.defaults.baseURL = url;
            });
          }
        }

        // 4. 重写fetch方法
        if (!window.originalFetch) {
          window.originalFetch = window.fetch;
          window.fetch = function (input, init) {
            // 处理相对路径
            if (typeof input === 'string' && !input.startsWith('http')) {
              input = url + (input.startsWith('/') ? '' : '/') + input;
            }
            // 处理Request对象
            if (input instanceof Request && !input.url.startsWith('http')) {
              input = new Request(
                url + (input.url.startsWith('/') ? '' : '/') + input.url,
                input
              );
            }
            return window.originalFetch(input, init);
          };
        }

        console.log("环境切换成功，当前baseUrl:", url);
        return true;
      },
      args: [currentEnv]
    }, (results) => {
      if (chrome.runtime.lastError) {
        console.error("脚本注入失败:", chrome.runtime.lastError);
        resolve(false);
      } else {
        resolve(true);
      }
    });
  });
}

// 监听当前标签页并注入脚本
function injectToCurrentTab(targetUrl) {
  return new Promise((resolve) => {
    chrome.tabs.query({ active: true, currentWindow: true }, (tabs) => {
      if (tabs.length > 0) {
        injectEnvScript(tabs[0].id, targetUrl).then(resolve);
      } else {
        resolve(false);
      }
    });
  });
}

// 监听页面加载完成事件，自动注入环境配置
chrome.webNavigation.onDOMContentLoaded.addListener((details) => {
  chrome.storage.local.get('currentEnv', (result) => {
    if (result.currentEnv) {
      injectEnvScript(details.tabId, result.currentEnv);
    }
  });
});

// 接收来自popup的消息
chrome.runtime.onMessage.addListener((request, sender, sendResponse) => {
  if (request.action === 'switchEnv') {
    console.log('收到来自popup的消息：', request);

    // 1. 更新代理规则
    updateRules(request.env.baseUrl)
      // 2. 注入环境变量脚本
      .then(success => success ? injectToCurrentTab(request.env) : false)
      // 3. 返回结果
      .then(success => sendResponse({ success: success }));
    return true; // 保持消息通道开放
  }
});
// http://localhost:3000

// ------------------------------------
// 监听页面导航开始前的事件（最早能注入的时机之一）
chrome.webNavigation.onBeforeNavigate.addListener((details) => {
  // 只处理目标网站（可根据需要限制域名）
  if (details.url.includes("localhost")) {
    chrome.storage.local.get('currentEnv', (result) => {
      if (result.currentEnv) {
        setTimeout(() => {
          injectEnvScript(details.tabId, result.currentEnv);
          console.log("details.url导航开始前", result.currentEnv, '----');
        }, 500);

      }
    });
  }
}, { urls: ["<all_urls>"] }); // 监听所有 URL 的导航
// 等待 service worker 初始化完成后再绑定事件
chrome.runtime.onInstalled.addListener(() => {

  // 监听页面加载的多个关键阶段，多次尝试注入
  const webNavigationEvents = [
    "onCommitted",       // 页面开始加载
    "onDOMContentLoaded", // DOM加载完成
    "onLoadCompleted"     // 页面完全加载
  ]; if (chrome.webNavigation) {
    // 为每个阶段绑定注入逻辑
    webNavigationEvents.forEach(eventName => {
      chrome.webNavigation[eventName].addListener((details) => {
        // 只处理目标网站（可根据需要限制域名）
        if (details.url.includes("localhost")) {
          chrome.storage.local.get('currentEnv', (result) => {
            if (result.currentEnv) {
              // setTimeout(() => {
              injectEnvScript(details.tabId, result.currentEnv);
              console.log("details.url导航开始前", result.currentEnv, '----');
              // }, 500);

            }
          });
        }
      }, { urls: ["<all_urls>"] }); // 监听所有 URL 的导航
    });
  }
})